/**
 * @file poj/2349/main.cpp
 * @author Ruiming Guo (guoruiming@stu.scu.edu.cn)
 * @brief 每一个outpost都会配有电波接收器，一些outpost会配有卫星接收器
 * 电波接收器有一定工作范围，都为D；卫星的工作范围是无限。
 * 求最小的D使得任意两点可以直接或间接通信。
 *
 * 通过连接 n - s 条边使得图有 s 个连通分量
 * 输出MST第 n - s 条边的权重即可
 *
 * @see <http://bailian.openjudge.cn/practice/2349/>
 * @see <http://bailian.openjudge.cn/practice/solution/34259329/>
 * @version 1.0
 * @date 2022-05-02
 *
 * @copyright Copyright (c) 2022
 *
 **/

#include <bits/stdc++.h>
using namespace std;
const int N = 510;
int x[N], y[N];
int s, n;
struct edge {
  int u, v;
  double d;
  bool operator<(const edge &b) const { return d < b.d; }
};
vector<edge> E;
inline double dist(int u, int v) {
  double dx = x[u] - x[v], dy = y[u] - y[v];
  return sqrt(dx * dx + dy * dy);
}
int par[N];
inline int find(int x) { return par[x] == x ? x : par[x] = find(par[x]); }

int main() {
  int tc;
  cin >> tc;
  while (tc--) {
    cin >> s >> n;
    for (int i = 0; i <= n; ++i) par[i] = i;
    E.clear();  // 记得清全局变量

    for (int i = 0; i < n; ++i) {
      cin >> x[i] >> y[i];
    }
    // 计算点对距离并排序
    for (int i = 0; i < n; ++i)
      for (int j = i + 1; j < n; ++j) E.push_back({i, j, dist(i, j)});
    sort(E.begin(), E.end());

    int cnt = 0;
    for (auto [u, v, cost] : E) {
      u = find(u), v = find(v);
      if (u == v) continue;
      par[u] = v;
      if (++cnt == n - s) {
        printf("%.2lf\n", cost);
        break;
      }
    }
  }
}
